/**
 * 2017年7月20日
 */
package cn.edu.bjtu.workbench;

/**
 * @author Alex
 *
 */
interface A{
	 void method();
}
interface B{
	int method();
}
interface C{
	int method(int c);
}
public class FP {
	public static void main(String[] args) {
		//我想调用function 需要传递一个实现A接口的对象
		//1 采用匿名类方式
		function(new A(){
			@Override
			public void method() {
				System.out.println("这个是通过匿名类方式");
			}
		});
		//2 通过labmda表达式
		function(()->{
			System.out.println("通过LAMBDA表达式");
		});
		
		//jdk中的接口也支持这种方式,但是前提是一个接口中只有一个方法,比如runnable接口
		//我想启动一个线程
		new Thread(new Runnable(){
			@Override
			public void run() {
				System.out.println("通过匿名类来实现一个线程");
			}
		}).start();
		new Thread(()->{
			System.out.println("通过LAMBDA实现一个线程");
		}).start();
		
		
		//同样可以返回值
		int res = functionB(()->{
			return  1;
		});
		System.out.println(res);
		res = functionB(()->2333);
		System.out.println(res);
		//同样可以接受参数
		res = functionC((x)->x*x, 5);
		System.out.println(res);
		res = functionC((x)->x*x, 100);
		System.out.println(res);
		res = functionC(new C() {
			@Override
			public int method(int c) {
				return c*c;
			}
		}, 100);
		System.out.println(res);
		res = functionC((x)->{
			return x+5;
		}, 6);
		System.out.println(res);
	}
	static void function(A a){
		a.method();
	}
	static int functionB(B b){
		return b.method();
	}
	static int functionC(C b,int c){
		return b.method(c);
	}
}
